<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>REVOKE</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="REFENTRY">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="sql-reset.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="sql-reset.html">快退</a></td><td width="60%" align="center" valign="bottom"></td><td width="10%" align="right" valign="top"><a href="sql-rollback.html">快进</a></td><td width="10%" align="right" valign="top"><a href="sql-rollback.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<h1><a name="SQL-REVOKE"></a>REVOKE</h1>
<div class="REFNAMEDIV"><a name="AEN53234"></a><h2>名称</h2>REVOKE&nbsp;--&nbsp;删除访问权限</div>
<a name="AEN53237"></a>
<div class="REFSYNOPSISDIV"><a name="AEN53239"></a><h2>语法</h2>
<pre class="SYNOPSIS">REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] <tt class="REPLACEABLE"><i>tablename</i></tt> [, ...]
    FROM { <tt class="REPLACEABLE"><i>username</i></tt> | GROUP <tt class="REPLACEABLE"><i>groupname</i></tt> | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { USAGE | SELECT | UPDATE }
    [,...] | ALL [ PRIVILEGES ] }
    ON SEQUENCE <tt class="REPLACEABLE"><i>sequencename</i></tt> [, ...]
    FROM { <tt class="REPLACEABLE"><i>username</i></tt> | GROUP <tt class="REPLACEABLE"><i>groupname</i></tt> | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE <tt class="REPLACEABLE"><i>dbname</i></tt> [, ...]
    FROM { <tt class="REPLACEABLE"><i>username</i></tt> | GROUP <tt class="REPLACEABLE"><i>groupname</i></tt> | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON FUNCTION <tt class="REPLACEABLE"><i>funcname</i></tt> ( [ [ <tt class="REPLACEABLE"><i>argmode</i></tt> ] [ <tt class="REPLACEABLE"><i>argname</i></tt> ] <tt class="REPLACEABLE"><i>argtype</i></tt> [, ...] ] ) [, ...]
    FROM { <tt class="REPLACEABLE"><i>username</i></tt> | GROUP <tt class="REPLACEABLE"><i>groupname</i></tt> | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE <tt class="REPLACEABLE"><i>langname</i></tt> [, ...]
    FROM { <tt class="REPLACEABLE"><i>username</i></tt> | GROUP <tt class="REPLACEABLE"><i>groupname</i></tt> | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON SCHEMA <tt class="REPLACEABLE"><i>schemaname</i></tt> [, ...]
    FROM { <tt class="REPLACEABLE"><i>username</i></tt> | GROUP <tt class="REPLACEABLE"><i>groupname</i></tt> | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE <tt class="REPLACEABLE"><i>tablespacename</i></tt> [, ...]
    FROM { <tt class="REPLACEABLE"><i>username</i></tt> | GROUP <tt class="REPLACEABLE"><i>groupname</i></tt> | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ ADMIN OPTION FOR ]
    <tt class="REPLACEABLE"><i>role</i></tt> [, ...] FROM <tt class="REPLACEABLE"><i>username</i></tt> [, ...]
    [ CASCADE | RESTRICT ]</pre>
</div>
<div class="REFSECT1"><a name="SQL-REVOKE-DESCRIPTION"></a><h2>描述</h2>
<p><tt class="COMMAND">REVOKE</tt> 撤销以前赋予一个或多个角色的权限。关键字 <tt class="LITERAL">PUBLIC</tt> 代表隐含定义的、拥有所有角色的组。</p>
<p>See the description of the <a href="sql-grant.html"><i>GRANT</i></a> command for the meaning of the privilege types</p>
<p>请注意，任何特定的角色都将拥有直接赋予它的权限，加上它所在组的权限，再加上赋予 <tt class="LITERAL">PUBLIC</tt> 的权限的总和。因此，举例来说，废止 <tt class="LITERAL">PUBLIC</tt> 的 <tt class="LITERAL">SELECT</tt> 权限并不意味着所有角色都失去了对该对象的 <tt class="LITERAL">SELECT</tt> 权限：那些直接得到的权限以及通过一个组得到的权限仍然有效。</p>
<p>如果指定了 <tt class="LITERAL">GRANT OPTION FOR</tt> ，那么只是撤销对该权限的授权的权力，而不是撤销该权限本身。否则，权限和授权选项都被撤销。</p>
<p>如果一个用户持有某个权限，并且还有授权的选项，并且还把这个权限赋予了其它用户，那么那些其它用户持有的权限都叫做依赖性权限。如果第一个用户持有的权限或者授权选项被撤销，而依赖性权限仍然存在；那么如果声明了 <tt class="LITERAL">CASCADE</tt> ，则所有依赖性权限都被撤销，否则撤销动作就会失败。这个递规的撤销只影响那种通过一个用户链赋予的权限，这个链条可以通过这条 <tt class="LITERAL">REVOKE</tt> 命令里面给出的用户跟踪。因此，如果权限本身是通过其它用户赋予的，那么被影响的用户可以有效地保留这个权限。</p>
<p>在撤销一个角色里的成员关系的时候，不是调用 <tt class="LITERAL">ADMIN OPTION</tt> 而是调用 <tt class="LITERAL">GRANT OPTION</tt> ，但是行为类似。不过这种形式的命令不允许出现 <tt class="LITERAL">GROUP</tt> 关键字。</p>
</div>
<div class="REFSECT1"><a name="SQL-REVOKE-NOTES"></a><h2>注意</h2>
<p>使用 <a href="app-psql.html"><span class="APPLICATION">psql</span></a> 的 <tt class="COMMAND">\z</tt> 命令显示在一个现存对象上赋予的权限。又见 <a href="sql-grant.html"><i>GRANT</i></a> 获取关于格式的信息。</p>
<p>一个用户只能撤销由它自己直接赋予的权限。举例来说，如果用户 A 带着授权选项把一个权限赋予了用户 B ，然后用户 B 又赋予了用户 C ，那么用户 A 不能直接将 C 的权限撤销。但是，用户 A 可以撤销用户 B 的授权选项，并且使用 <tt class="LITERAL">CASCADE</tt> 选项，这样，用户 C 的权限就会自动被撤销。另外一个例子：如果 A 和 B 都赋予了 C 同样的权限，则 A 可以撤销他自己的授权选项，但是不能撤销 B 的，因此 C 仍然有效地拥有该权限。</p>
<p>如果一个对象的非所有者试图 <tt class="COMMAND">REVOKE</tt> 对象上的权限，那么，如果这个用户没有该对象上的权限，则命令马上失败。只要他有某些权限，则命令继续，但是它只撤销那些该用户有授权选项的权限。如果没有在授权选项，那么 <tt class="COMMAND">REVOKE ALL PRIVILEGES</tt> 形式将发出一个错误信息，而对于其它形式的命令而言，如果同样是命令中指定名字的权限没有相应的授权选项，那么该命令将发出一个警告。原则上这些语句也适用于对象所有者，但是因为所有者总是认为持有所有授权选项，所以这种情况绝不会发生。</p>
<p>如果一个超级用户发出一个 <tt class="COMMAND">GRANT</tt> 或 <tt class="COMMAND">REVOKE</tt> 命令，那么命令是以被影响的对象的所有者执行的。因为所有权限最终从对象所有者(可能间接通过赋权选项)获取，超级用户可以废除所有权限，但是这样就要求像上面说的那样使用  <tt class="LITERAL">CASCADE</tt> 。</p>
<p><tt class="COMMAND">REVOKE</tt> 也可以由一个并非被影响对象的所有者来执行，不过这个角色必须是拥有该对象的角色的成员，或者是一个在该对象上持有 <tt class="LITERAL">WITH GRANT OPTION</tt> 的角色的成员。在这种情况下，该命令执行起来就好像是由实际拥有该对象的角色，或者是在该对象上持有 <tt class="LITERAL">WITH GRANT OPTION</tt> 权限的角色发出的一样。比如，如果表 <tt class="LITERAL">t1</tt> 被 <tt class="LITERAL">g1</tt> 所有，而 <tt class="LITERAL">u1</tt> 是 <tt class="LITERAL">u1</tt> 的成员，那么 <tt class="LITERAL">u1</tt> 可以撤销 <tt class="LITERAL">t1</tt> 上的权限，而纪录为 <tt class="LITERAL">g1</tt> 发出的命令。这种现像包括 <tt class="LITERAL">u1</tt> 和其它 <tt class="LITERAL">g1</tt> 角色成员发出的授权。</p>
<p>如果执行 <tt class="COMMAND">REVOKE</tt> 的角色持有权限是通过多层成员关系获得的，那么具体是哪个包含的角色执行的该命令就是未声明的。在这种场合下，最好的方法是使用 <tt class="COMMAND">SET ROLE</tt> 成为你希望执行 <tt class="COMMAND">REVOKE</tt> 的角色。不这么做的后果可能导致删除你不想删除的权限，或者是啥权限都没有删除。</p>
</div>
<div class="REFSECT1"><a name="SQL-REVOKE-EXAMPLES"></a><h2>例子</h2>
<p>撤销公众在表 <tt class="LITERAL">films</tt> 上的插入权限：</p>
<pre class="PROGRAMLISTING">REVOKE INSERT ON films FROM PUBLIC;</pre>
<p>撤销用户 <tt class="LITERAL">manuel</tt> 对视图 <tt class="LITERAL">kinds</tt> 的所有权限：</p>
<pre class="PROGRAMLISTING">REVOKE ALL PRIVILEGES ON kinds FROM manuel;</pre>
<p>请注意这样实际上意味着"撤销所有我赋予的权限"。</p>
<p>删除用户 <tt class="LITERAL">joe</tt> 的 <tt class="LITERAL">admins</tt> 成员关系：</p>
<pre class="PROGRAMLISTING">REVOKE admins FROM joe;</pre>
</div>
<div class="REFSECT1"><a name="SQL-REVOKE-COMPATIBILITY"></a><h2>兼容性</h2>
<p><a href="sql-grant.html"><i>GRANT</i></a> 命令的兼容性信息基本上也适用于 <tt class="COMMAND">REVOKE</tt> 。语法概要是：</p>
<pre class="SYNOPSIS">REVOKE [ GRANT OPTION FOR ] <tt class="REPLACEABLE"><i>privileges</i></tt>
    ON <tt class="REPLACEABLE"><i>object</i></tt> [ ( <tt class="REPLACEABLE"><i>column</i></tt> [, ...] ) ]
    FROM { PUBLIC | <tt class="REPLACEABLE"><i>username</i></tt> [, ...] }
    { RESTRICT | CASCADE }</pre>
<p>标准要求 <tt class="LITERAL">RESTRICT</tt> 或 <tt class="LITERAL">CASCADE</tt> 之一必须出现，但是 PostgreSQL 假设缺省是 <tt class="LITERAL">RESTRICT</tt> 。</p>
</div>
<div class="REFSECT1"><a name="AEN53347"></a><h2>又见</h2>
<p><a href="sql-grant.html"><i>GRANT</i></a></p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="sql-reset.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="sql-rollback.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">RESET</td><td width="34%" align="center" valign="top"><a href="sql-commands.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">ROLLBACK</td></tr>
</table>
</div>
</body></html>